package com.lry.util.requestcore.domain;

import cn.hutool.http.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

/**
 * @author ALI
 * @since 2023/5/9
 */
@Data
public class GRequest {

    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private String jdbcType = "scsyjt";
    /**
     * 方法，默认时GET
     */
    private Method method = Method.GET;
    /**
     * 地址
     */
    private String api;
    /**
     * 目标表
     */
    private String targetTable;
    /**
     * 分页对象，存在分页对象，怎会递归进行分页请求
     */
    private PageReq pageInfo;
    /**
     * 已经创建了表，该参数为内部参数
     */
    private Boolean createdTable = false;
    /**
     * 请求头，默认添加appKey
     */
    private Map<String, String> headers;
    /**
     * 参数
     */
    private RequestParam requestParam;
    /**
     * 登录对象
     */
    private LoginRequest loginRequest;
    /**
     * 响应对象
     */
    private Response response;

    /**
     * 增加默认字段，一般是指时间字段
     */
    private Boolean addDefaultField = false;


    @Data
    public static class PageReq {

        private Integer pageNum = 1;

        /**
         * 页大小，为空则表示全量拉取
         */
        private Integer pageSize;

        /**
         * 页码映射字段
         */
        private String pageNumParam;

        /**
         * 页大小映射字段
         */
        private String pageSizeParam;

        public Map<String, Object> getPageParam() {
            Map<String, Object> result = new HashMap<>();
            result.put(pageNumParam, pageNum);
            result.put(pageSizeParam, pageSize);
            return result;
        }

        public String getPageNumParam() {
            return StringUtils.isBlank(pageNumParam) ? "pageNum" : pageNumParam;
        }

        public String getPageSizeParam() {
            return StringUtils.isBlank(pageSizeParam) ? "pageSize" : pageSizeParam;
        }
    }

    @Data
    public static class RequestParam {

        /**
         * 路径参数
         */
        private Map<String, Object> param;
        /**
         * 请求体
         */
        private Map<String, Object> body;

        /** 时间偏移字段 */
        private String offsetDateField;

        /** 数据库的数据偏移字段 */
        private String dbOffsetDateField;
        /**
         * 时间偏移量，建议取负值
         */
        private Integer offsetDate;

        /**
         * 偏移单位：m（分）,s（秒）,h（时）,d（天），M（月）
         */
        private String offsetDateUnit;

        /** 时间偏移字段格式化 */
        private String offsetDateFormat = "%s";

        /** 时间偏移格式化规则 */
        private String dateFormat = DATE_FORMAT;

        /** 是否是时间字符串 */
        private Boolean offsetDateString = true;

        /** 偏移结束时间 */
        private String endDateFieldValue;

        /** 偏移结束时间字段 */
        private String endDateField;

    }

    @Data
    public static class Response {

        /**
         * id字段，如果该值存在，会取比配该字段
         */
        private String idField;

        /**
         * 需要保持的字段列表，如果为空则表示全部
         */
        private List<String> saveFields;

        /**
         * 实际数据字段名称，多级，用“.”分隔
         */
        private String dataFieldName;

        /**
         * 数据时间字段格式化
         */
        private DateFieldFormat dateFieldFormat;
    }

    @Data
    public static class LoginRequest {

        /**
         * 登录请求的方式（get/post），默认post
         */
        private Method method = Method.POST;

        /**
         * 登录请求的地址
         */
        private String url;

        /**
         * 登录请求的参数
         */
        private Map<String, Object> body;

        /**
         * 登录请求的header
         */
        private Map<String, String> headers;

        /**
         * 响应的token字段，如果是多级的，用“.”分开，如data.token
         */
        private String tokenFieldName;

        /** token 格式化 */
        private String tokenFormat = "%s";

        /**
         * 请求头映射，映射到普通请求的 header上
         */
        private String headerMapping;

    }

    @Data
    public static class DateFieldFormat {

        /** 需要格式化的字段 */
        private List<String> fields;

        /** 时间格式 */
        private String format = "yyyy-MM-dd HH:mm:ss";

        private String suf = "_stamp";
    }
}
